/**
 * @widoc $.fn.initDate
 * @namespace comp
 * @des 将当前元素初始化为时间框。
 * @type function
 * @param {object} opts
 * @param {string} opts.name 文本框的 name 属性值，初始化完成后，会在 el 后生成 <input type="hidden" name="name" />，以便表单取值
 * @param {string=} opts.separator 年月日分隔符，默认为'-'
 * @param {string=} opts.formater 值的formater，默认为'yyyy-MM-dd'
 * @param {string=} opts.value 值
 * @param {boolean=} opts.readonly 是否为只读，默认为 false
 * @param {function} opts.callback callback(date) 值变化时的回调函数
 *   参数：date {string} 选中的时间
 * @return {object|undefined} obj
 * @rtn {string} obj.getDate() 获取当前值
 * @rtn {function} obj.setDate(sDate) 设置值，sDate {string}
 * @rtn {function} obj.setDisabled(readonly) 设置只读状态
 */
$.fn.initDate = function(opts){
    if(!opts.name){
        console.error('initDate 初始化时必须传入 name!');
        return;
    }
    opts = $.extend({
        //name:string
        separator: '-',
        formater: 'yyyy-MM-dd',
        value: '',
        readonly: false,
        callback: $.noop
    }, opts);
    var el = this, jqIpt,
        sDate = '', aDate,// 值对应的字符串和数组[年,月,日]
        readonly,
        api;
    var setDate = function(newSDate){
        if(!newSDate){
            newSDate = ''
        }
        if(newSDate !== sDate){
            sDate = newSDate;
            aDate = parseDateArr(newSDate);
            jqIpt.val(newSDate);
            opts.callback.call(el, newSDate);
        }
    };
    var getDate = function(){
        return sDate;
    };
    /**
     * 将字符串转换为[年,月,日]
     * @param str {string} 以 opts.separator 分隔的日期字符串
     * @return {Array} 数组项为字符串或数字
     */
    var parseDateArr = function(str){
        var dateArr = str.split(opts.separator),
            date;
        if(dateArr.length < 3){
            date = new Date();
            dateArr = [date.getFullYear(), date.getMonth() + 1, date.getDate()];
        }
        return dateArr;
    };
    var fOnDatepickerCb = function(opCode, dataType, data){
        if(dataType == 1){
            var obj = JSON.parse(data.replace(/'/g, '"')),
                date = new Date(obj.year, obj.month - 1, obj.day);
            setDate(date.format(opts.formater));
        }
    };
    var fSetDisabled = function(stat){
        readonly = stat !== false;
        if(readonly){
            el.addClass('wi-date-disabled');
        }
        else{
            el.removeClass('wi-date-disabled');
        }
    };
    var fOnTap = function(e){
        if(readonly){
            return;
        }
        uexControl.cbOpenDatePicker = fOnDatepickerCb;// 点开时将系统的日期组件的回调设置为针对当前元素
        aDate = parseDateArr(sDate);
        uexControl.openDatePicker.apply(uexControl, aDate);// 打开时将系统的日期组件值设置为当前组件值
        /* appcan4 接口调整：openDatePicker: function(year, month, day, fDatePickerCb)
         前 3 行可改为以下实现 TODO 测试 */
        //aDate = parseDateArr(sDate);
        //uexControl.openDatePicker.apply(uexControl, aDate.concat(fOnDatepickerCb));// 打开时将系统的日期组件值设置为当前组件值
    };
    var init = function(){
        jqIpt = $('<input class="wi-date-txt" type="text" name="' + opts.name + '"' + opts.value + ' readonly />');
        el.addClass('wi-date')
          .html(jqIpt);
        setDate(opts.value);// 设置初始值
        el.off('tap.wiDate')
          .on('tap.wiDate', fOnTap);
        el.data('wiDate', api);
        fSetDisabled(opts.readonly);
    };
    api = {
        getDate: getDate,
        setDate: setDate,
        setDisabled: fSetDisabled
    };
    init();
    return api;
};